package com.beici.waterghost.controller;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.beici.waterghost.model.resultes;
import com.beici.waterghost.model.user;
import com.beici.waterghost.service.impl.userServiceImpl;
import com.beici.waterghost.utils.contextUtils;
import com.beici.waterghost.utils.dateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.websocket.server.PathParam;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

/**
 * @auther WaterGhost
 * @date 2022/2/8 13:29
 */
@CrossOrigin
@RestController
@RequestMapping("/file")
public class fileController {

    @Autowired
    private userServiceImpl userService;

    @PostMapping("/uploadFile")
    public resultes uploadFile(MultipartFile file){
        if (file.getContentType().split("/")[0].equals("image")==false){return resultes.error("格式错误");}
                // Endpoint以华东1（杭州）为例，其它Region请按实际情况填写。
                String endpoint = "https://oss-cn-shenzhen.aliyuncs.com";
                // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
                String accessKeyId = "LTAI5tRU6dacCD7tPh3VZ4sF";
                String accessKeySecret = "Bdmkl2vuDiLUGmRHFyCExlKQhgqMMs";
                // 填写Bucket名称，例如examplebucket。
                String bucketName = "waterghost";
                // 填写Object完整路径，例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
              Integer userId=null;
                try{
                  user userPhone = (user) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
                  userId = userPhone.getUserId();
              }catch (NullPointerException e){
                  System.out.println(e.getMessage());
                  return resultes.NoAuthenction();
              }
                 String objectName = userId+"/"+ dateUtils.getCurrentDate()+"/"+file.getOriginalFilename();
                // 填写本地文件的完整路径，例如D:\\localpath\\examplefile.txt。
                // 如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件流。

                // 创建OSSClient实例。
                OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
                InputStream inputStream = null;
                try {
                     inputStream = file.getInputStream();
                    // 创建PutObject请求。
                    ossClient.putObject(bucketName, objectName, inputStream);
                } catch (OSSException oe) {
                    return resultes.error("上传失败");
                } catch (ClientException ce) {
                    return resultes.error("文件服务器连接失败");
                } catch (FileNotFoundException e) {
                    return resultes.error("文件为空");
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (ossClient != null) {
                        ossClient.shutdown();
                    }
                    if (inputStream!=null){
                        try {
                            inputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
                String http = endpoint.split("//")[1];
                String url = "https://"+bucketName+"."+http+"/"+objectName;
                boolean b = contextUtils.verfityImage(url);
                return b?resultes.success("上传成功",url):resultes.divResultes("https://waterghost.oss-cn-shenzhen.aliyuncs.com/root/error.png","请勿上传敏感图片",209);
        }

    @PostMapping("/noautehuploadFile")
    public resultes noAuthenuploadFile(MultipartFile file){
        if (file.getContentType().split("/")[0].equals("image")==false){return resultes.error("格式错误");}
        // Endpoint以华东1（杭州）为例，其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-shenzhen.aliyuncs.com";
        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        String accessKeyId = "LTAI5tRU6dacCD7tPh3VZ4sF";
        String accessKeySecret = "Bdmkl2vuDiLUGmRHFyCExlKQhgqMMs";
        // 填写Bucket名称，例如examplebucket。
        String bucketName = "waterghost";
        // 填写Object完整路径，例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
        String objectName = "public"+"/"+ dateUtils.getCurrentDate()+"/"+file.getOriginalFilename();
        // 填写本地文件的完整路径，例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件流。

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        InputStream inputStream = null;
        try {
            inputStream = file.getInputStream();
            // 创建PutObject请求。
            ossClient.putObject(bucketName, objectName, inputStream);
        } catch (OSSException oe) {
            return resultes.error("上传失败");
        } catch (ClientException ce) {
            return resultes.error("文件服务器连接失败");
        } catch (FileNotFoundException e) {
            return resultes.error("文件为空");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
            if (inputStream!=null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        String http = endpoint.split("//")[1];
        String url = "https://"+bucketName+"."+http+"/"+objectName;
        boolean b = contextUtils.verfityImage(url);
        return b?resultes.success("上传成功",url):resultes.success("请勿上传敏感图片","https://waterghost.oss-cn-shenzhen.aliyuncs.com/root/error.png");
    }

    @PostMapping("/upback")
    public resultes upback(MultipartFile file){
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        user principal = (user) authentication.getPrincipal();
        resultes resultes = uploadFile(file);
        String data = (String) resultes.getData();
        return userService.updateBack(principal.getUserId(),data);
    }

    @PostMapping("/uphead")
    public resultes uphead(MultipartFile file){
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        user principal = (user) authentication.getPrincipal();
        resultes resultes = uploadFile(file);
        String data = (String) resultes.getData();
        return userService.updateHead(principal.getUserId(),data);
    }
}
